package ComoViajo;

import java.util.ArrayList;
import java.util.HashMap;

public class Colectivo implements EstacionInterface {
	protected Linea linea;
	protected Direccion direccion = new Direccion("", 0);
	public float COSTO_BOLETO_MENOR_DE_3KM = (float) 1.1;
	public float COSTO_BOLETO_ENTRE_3KM_6KM = (float) 1.2;
	public float COSTO_BOLETO_MAYOR_DE_6KM = (float) 1.25;
	
	
	public Colectivo(String linea) {
		this.linea=Linea.getInstance(linea);
	}

	public Colectivo(String linea, Direccion direccion) {
		this.linea = Linea.getInstance(linea);
		this.direccion = direccion;
	}

	@Override
	public boolean estaEnLaMismaLineaQue(EstacionInterface medioDetransporte) {
		return this.linea.toString().equals(medioDetransporte.getLinea());
	}


	public float getCosto(EstacionInterface medioDeTransporteSiguiente,	int estacionesVisitadas) {

		if(this.estaEnLaMismaLineaQue(medioDeTransporteSiguiente)) {
			int distancia = FactoryModuloExterno.getMapaDeTransporte().getDistancia(this.direccion, medioDeTransporteSiguiente.getDireccion());
			if(distancia <= 3)
				return COSTO_BOLETO_MENOR_DE_3KM;
			else if (distancia <= 6) {
				return COSTO_BOLETO_ENTRE_3KM_6KM;
			} else {
				return COSTO_BOLETO_MAYOR_DE_6KM;	
			}
		}
		return 0;
	}


	public EstacionInterface getEstacionAnterior() {
		// solo tiene estacion siguiente
		return null;
	}

	public EstacionInterface getEstacionDeCombinacion(EstacionInterface estacionDestino) {
		if(estacionDestino instanceof Colectivo) {
			if(FactoryModuloExterno.getMapaDeTransporte().puedeCombinar(this, (Colectivo) estacionDestino)){
				return new Colectivo(this.linea.toString(), FactoryModuloExterno.getMapaDeTransporte().dondeCombina(this, (Colectivo) estacionDestino));
			}

			return null;
		}
		
		
		EstacionInterface estacionActual;
		
		estacionActual=estacionDestino;
		while (estacionActual!=null) {
			if(estacionActual.getEstacionesCercanas().contains(this)) {
				return estacionActual;
			}
			
				
			estacionActual=estacionActual.getEstacionSiguiente(null);
		}
			
		estacionActual=estacionDestino.getEstacionAnterior();
		while (estacionActual!=null) {
			if(estacionActual.getEstacionesCercanas().contains(this)) {
				return estacionActual;
			}
			
			estacionActual=estacionActual.getEstacionAnterior();
		}
		return null;
		
	}


	public EstacionInterface getEstacionSiguiente(EstacionInterface estacionDestino) {
		if(this.estaEnLaMismaLineaQue(estacionDestino)){
			return estacionDestino;
		}
		
		return null;
	}

	
	public ArrayList<HashMap<String, EstacionInterface>> getEstacionesQueCombinanCon(EstacionInterface estacionDestino) {
		ArrayList<HashMap<String, EstacionInterface>> combinaciones=new ArrayList<HashMap<String, EstacionInterface>>();
		HashMap<String, EstacionInterface> combinacion;
		EstacionInterface estacionQueCombina,estacionActual;
		
		estacionActual=this;
		while (estacionActual!=null) {
			if((estacionQueCombina=estacionActual.getEstacionDeCombinacion(estacionDestino))!=null){
				combinacion=new HashMap<String, EstacionInterface>();
				combinacion.put("combinacionEstacionOrigen", estacionActual);
				combinacion.put("combinacionEstacionDestino", estacionQueCombina);
				
				combinaciones.add(combinacion);
			}
			estacionActual=estacionActual.getEstacionSiguiente(estacionDestino);
		}
			
		return combinaciones;
	}

	public String getLinea() {
		return this.linea.toString();
	}

	public int getTiempoDesdeEstacion(EstacionInterface estacionAnterior) {
		if(this.estaEnLaMismaLineaQue(estacionAnterior)) {
			int distancia = FactoryModuloExterno.getMapaDeTransporte().getDistancia(this.direccion, estacionAnterior.getDireccion());
			return (distancia/15)*60;		
		}
		return 0;
	}


	public ArrayList<EstacionInterface> getEstacionesCercanas() {
		if(this.direccion.isNull()) {	
			return FactoryModuloExterno.getMapaDeTransporte().getTransportesCercanos(this.direccion);
		}
		
		return null;
	}
	
	public String toString(){
		return this.linea.toString()+" "+this.direccion.toString();
	}

	@Override
	public void notificar(Viaje viaje) {
		this.linea.notificar(viaje);
		
	}

	public int getUso() {
		return this.linea.getUso();
	}

	public Direccion getDireccion() {
		return this.direccion;
	}

}
